package models;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import play.db.jpa.Model;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;

@Entity
public class Politico extends Model {

	private String cargo;
	private String nome;
	private String email;
	private String uf;
	private String cidade;
	private String foto;
	private String idParlamento;

	private String partido;

	private String voteNaWebId;

	@ManyToOne
	private Casa casa;
	@OneToMany(mappedBy="autor", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
	private Set<Materia> propostas;
	@OneToMany(mappedBy="politico", cascade=CascadeType.ALL, fetch = FetchType.LAZY)
	private Set<Posicao> posicoes;
	@ManyToMany
	private Set<Eleitor> eleitores;
	
	public String getCargo() {
		return cargo;
	}

	public void setCargo(String cargo) {
		this.cargo = cargo;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getUf() {
		return uf;
	}

	public void setUf(String uf) {
		this.uf = uf;
	}

	public String getFoto() {
		return foto;
	}

	public void setFoto(String foto) {
		this.foto = foto;
	}

	public String getPartido() {
		return partido;
	}

	public void setPartido(String partido) {
		this.partido = partido;
	}

	public Set<Eleitor> getEleitores() {
		return eleitores;
	}

	public void setEleitores(Set<Eleitor> eleitores) {
		this.eleitores = eleitores;
	}

	public Set<Posicao> getPosicoes() {
		return posicoes;
	}

	public void setPosicoes(Set<Posicao> posicoes) {
		this.posicoes = posicoes;
	}

	public Casa getCasa() {
		return casa;
	}

	public void setCasa(Casa casa) {
		this.casa = casa;
	}

	public Set<Materia> getPropostas() {
		return propostas;
	}

	public void setPropostas(Set<Materia> propostas) {
		this.propostas = propostas;
	}

	public String getIdParlamento() {
		return idParlamento;
	}

	public void setIdParlamento(String idParlamento) {
		this.idParlamento = idParlamento;
	}

	public void setVoteNaWebId(String voteNaWebId) {
		this.voteNaWebId = voteNaWebId;
	}

	public String getVoteNaWebId() {
		return voteNaWebId;
	}

	public Posicao getPosicao(Materia materia) {
		Posicao p = Posicao
				.find("select p from Posicao p where p.politico = ? AND p.materia = ?",
						this, materia).first();
		return p;
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public static class PoliticoJsonAdapter implements
			JsonSerializer<Collection<Politico>> {
		@Override
		public JsonElement serialize(Collection<Politico> politicos, Type arg1,
				JsonSerializationContext arg2) {
			JsonArray resultado = new JsonArray();

			for (Politico politico : politicos) {
				JsonObject objeto = new JsonObject();
				objeto.add("id", new JsonPrimitive(politico.getId()));
				objeto.add("nome", new JsonPrimitive(politico.getNome()));
				objeto.add("foto", new JsonPrimitive(politico.getFoto()));
				objeto.add("partido", new JsonPrimitive(politico.getPartido()));
				resultado.add(objeto);
			}

			return resultado;
		}
	}
}
